
function setCookie(key, value, options) {
      // 为了防止options为空，我们需要给options设置默认值; 
      options = options || {};
      // options => { expires , path , domain };
      // 多个可以选参数在同一个函数之中存在，应该把可以选参数放在对象里; 
      // 因为参数是有序的; 对象是无序的; 
      if (options.expires) {
            var d = new Date();
            d.setDate(d.getDate() + options.expires);
      }
      // 拼接字符串; 
      var cookie_string = [
            key + "=" + value,
            options.path ? ";path=" + options.path : "",
            options.expires ? ";expires=" + d : "",
            options.domain ? ";domain=" + options.domain : ""
      ].join("");

      // console.log(cookie_string);
      document.cookie = cookie_string;
}
function removeCookie(key, options) {
      // console.log({ ...options, expires : -1 });
      setCookie(key, null, { ...options, expires: -1 });
}
function getCookie(key) {
      var cookie_array = document.cookie.split("; ");
      for (var i = 0; i < cookie_array.length; i++) {
            var cookie_item_array = cookie_array[i].split("=");
            // 和目标值去比对; 
            if (key === cookie_item_array[0]) {
                  return (cookie_item_array[1]);
            }
      }
      return "";
}
function jsonp(url, callback_felid, callback) {
      var script = document.createElement("script");
      script.src = url;
      // 自定义一个函数名; 
      // 全局的函数名 => 完全不可能和别人的名字重合; 
      // 时间戳; 以时间戳命名函数; 
      // 随机数; => 更优的方案，可以后续优化; 
      var fn_name = "_" + Date.now();
      // 因为我们的路径拼接分成两种情况; 
      // 一种是有 ? 一种是没有 ? 
      // 有 ? 我就用 & 拼接; 
      // 没有 ? 我就用 ? 拼接; 
      url += (/\?/.test(url) ? "&" : "?") + callback_felid + "=" + fn_name;

      script.src = url;
      document.body.appendChild(script);

      script.onload = function () {
            document.body.removeChild(script);
      }
      // 建立全局函数 : 
      // 让我们随机名称的函数去调用传入的回调函数;
      window[fn_name] = function (res) {
            callback(res);
      }
}

function ajax(url, options) {
      return new Promise(function (resolve) {
            options = Object.assign({
                  type: "GET"
            }, options);
            var xhr = new XMLHttpRequest();
            xhr.open(options.type, url);
            // 判定请求发送形式是不是POST; 
            if (options.type.toUpperCase() === "POST")
                  xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.send();
            // 创建一个promise对象，把状态机包裹进去; 
            xhr.onreadystatechange = function () {
                  if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
                        typeof options.callback === "function" ? options.callback(xhr.responseText) : "";
                        resolve(xhr.responseText);
                  }
            }
      });
}